﻿/**
 * 存储localStorage
 */
export const setStore = (name, content) => {
    if (!name) return;
    if (typeof content !== 'string') {
        content = JSON.stringify(content);
    }
    window.localStorage.setItem(name, content);
};

/**
 * 获取localStorage
 */
export const getStore = name => {
    if (!name) return;
    let content = window.localStorage.getItem(name);
    if (!content) return '';
    if (content.indexOf('{') >= 0 || content.indexOf('[') >= 0) {
        return JSON.parse(content);
    } else {
        return content;
    }
};

/**
 * 删除localStorage
 */
export const removeStore = name => {
    if (!name) return;
    window.localStorage.removeItem(name);
};

/**
 * 将Base64图片转换为File对象
 * @param {String} base64 - 带前缀的Base64字符串
 * @param {String} [filename='image'] - 生成的文件名
 * @param {String} [mimeType='image/png'] - 文件类型
 * @returns {Promise<File>}
 */
export function base64ToFile(base64, filename = 'image', mimeType = 'image/png') {
    // 1. 移除Base64前缀（如果存在）
    const base64Data = base64.split(',')[1] || base64;

    // 2. 转换为二进制字符串
    const binaryStr = atob(base64Data);

    // 3. 转换为Uint8Array
    const length = binaryStr.length;
    const uint8Array = new Uint8Array(length);
    for (let i = 0; i < length; i++) {
        uint8Array[i] = binaryStr.charCodeAt(i);
    }

    // 4. 创建File对象
    return new File([uint8Array], `${filename}.${mimeType.split('/')[1]}`, {
        type: mimeType,
    });
}

/**
 * 时间戳格式化
 */
export const getDateTime = function (timestamp) {
    let t = null;
    // 不传值，则获取当前时间
    if (timestamp === undefined) {
        t = new Date();
    } else if (timestamp) {
        t = new Date(parseInt(timestamp));
    }

    if (t) {
        var n = t.getFullYear();
        var a = t.getMonth() + 1;
        var r = t.getDate();
        var o = t.getHours();
        var i = t.getMinutes();
        var s = t.getSeconds();

        a >= 10 || (a = '0' + a),
            r >= 10 || (r = '0' + r),
            o >= 10 || (o = '0' + o),
            i >= 10 || (i = '0' + i),
            s >= 10 || (s = '0' + s);

        return [
            n, // yy 0
            a, // mm 1
            r, // dd 2
            n + '-' + a, // yy-mm 3
            a + '/' + r, // mm/dd 4
            o + ':' + i + ':' + s, // hh:mm:ss 5
            n + '-' + a + '-' + r + ' ' + o + ':' + i + ':' + s, // yy-mm-dd hh:mm::ss 6
            a + '-' + r + ' ' + o + ':' + i + ':' + s, // mm-dd hh:mm::ss 7
            n + '-' + a + '-' + r, // yy-mm-dd 8
            n + a + r, // yymmdd 9
            n + a, //yymm 10
            n + '-' + a + '-' + r + ' ' + o + ':' + i, // yy-mm-dd hh:mm 11
        ];
    } else {
        return ['--', '--', '--', '--', '--', '--', '--', '--', '--'];
    }
};

/**
 * 日期转时间戳
 */
export const getTimestamp = e => {
    var t;
    if (e) {
        e = e.replace(/-/g, '/');
        t = new Date(e);
    } else t = new Date();
    return t.getTime().toString();
};

// 邮箱校验
export function validateEmail(email) {
    const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
    return regex.test(email);
}

// 判断当前环境
export function detectDevice() {
    const ua = navigator.userAgent.toLowerCase();

    // 检测是否为移动设备（包括平板）
    if (/mobile|android|iphone|ipod|blackberry/i.test(ua)) {
        return 'mobile';
    }

    // 特别处理 iPad（iPadOS 13+ 的 UA 不再包含 "iPad"）
    if ((navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) || /ipad/i.test(ua)) {
        return 'tablet'; // iPad 或其他平板
    }

    // 桌面设备
    return 'pc';
}

export const encrypt = text => {
    // 1. 使用encodeURIComponent处理特殊字符
    const encodedText = encodeURIComponent(text);
    // 2. 使用btoa进行Base64编码
    const base64Encoded = btoa(encodedText);
    // 3. 将Base64中的'+', '/'替换为英文字符，处理'='
    return base64Encoded
        .replace(/\+/g, '-') // '+' 替换为 '-'
        .replace(/\//g, '_') // '/' 替换为 '_'
        .replace(/=+$/, ''); // 移除末尾的 '='
};

export const decrypt = encryptedText => {
    // 1. 还原Base64编码中的特殊字符
    let base64Encoded = encryptedText
        .replace(/-/g, '+') // '-' 还原为 '+'
        .replace(/_/g, '/'); // '_' 还原为 '/'

    // 2. 添加被移除的 '='
    while (base64Encoded.length % 4 !== 0) {
        base64Encoded += '=';
    }

    // 3. 使用atob进行Base64解码
    const decodedText = atob(base64Encoded);
    // 4. 使用decodeURIComponent还原原始字符串
    return decodeURIComponent(decodedText);
};

export const isLoginFun = () => {
    let token = getStore('signatrue_token');
    return token ? true : false;
};

/**
 * 去抖动函数
 */
export const debounce = function (action, wait) {
    let timeout;
    return function () {
        let ctx = this;
        let args = arguments;

        if (timeout) clearTimeout(timeout);

        let callNow = !timeout;
        timeout = setTimeout(() => {
            timeout = null;
        }, wait);

        if (callNow) action.apply(ctx, args);
    };
};

// 节流
export function throttle(fn, wait) {
    let lastTime = 0; // 上次执行时间戳

    return function (...args) {
        const now = new Date().getTime(); // 当前时间戳

        if (now - lastTime >= wait) {
            fn.apply(this, args); // 执行目标函数
            lastTime = now; // 更新上次执行时间戳
        }
    };
}

// 判断是否在容器内
export function isRectInsideParent(childRect, parentRect) {
    if (!childRect || !parentRect) return false;

    return childRect.left >= parentRect.left && childRect.right <= parentRect.right;
}


/**
 * 限制输入框内容宽度
 * @param {HTMLInputElement} inputEl - 输入框 DOM 元素
 * @param {number} maxWidth - 最大宽度（像素）
 * @returns {Function} - 清理函数，用于移除限制
 */
export function limitInputWidth(inputEl, maxWidth) {
  if (!(inputEl instanceof HTMLInputElement)) {
    throw new Error('Invalid input element. Expected HTMLInputElement.');
  }

  // 设置基本样式
  inputEl.style.whiteSpace = 'nowrap';
  inputEl.style.overflow = 'hidden';
  inputEl.style.textOverflow = 'ellipsis';

  // 创建用于测量文本宽度的临时元素
  const tempSpan = document.createElement('span');
  tempSpan.style.visibility = 'hidden';
  tempSpan.style.position = 'absolute';
  tempSpan.style.whiteSpace = 'nowrap';
  document.body.appendChild(tempSpan);

  // 同步输入框样式到临时元素
  const syncStyles = () => {
    const computedStyle = getComputedStyle(inputEl);
    tempSpan.style.font = computedStyle.font;
    tempSpan.style.letterSpacing = computedStyle.letterSpacing;
    tempSpan.style.padding = computedStyle.padding;
    tempSpan.style.boxSizing = computedStyle.boxSizing;
  };

  // 处理输入事件
  const handleInput = () => {
    syncStyles();
    tempSpan.textContent = inputEl.value;
    
    // 如果文本宽度超过限制，逐步删除字符
    if (tempSpan.offsetWidth > maxWidth) {
      let truncatedValue = inputEl.value;
      while (truncatedValue.length > 0) {
        truncatedValue = truncatedValue.slice(0, -1);
        tempSpan.textContent = truncatedValue;
        if (tempSpan.offsetWidth <= maxWidth) break;
      }
      inputEl.value = truncatedValue;
    }
  };

  // 添加事件监听器
  inputEl.addEventListener('input', handleInput);
  inputEl.addEventListener('blur', syncStyles); // 失去焦点时重新同步样式

  // 初始检查
  handleInput();

  // 返回清理函数
  return () => {
    inputEl.removeEventListener('input', handleInput);
    inputEl.removeEventListener('blur', syncStyles);
    if (tempSpan.parentNode) {
      tempSpan.parentNode.removeChild(tempSpan);
    }
  };
}


